package com.hca.training.zk.javabasic.Thread.SellTickat2_synchronized;

/**
 * 第二种方式创建售票
 * 不会卖假票，没有重复的
 *
 * 为了模拟更真实的场景   加了线程睡眠
 // 加入之后出现了线程问题，相同票卖了多次（cpu的原子性），而且有负数（随机性，延迟导致的）
 //导致问题的原因：1.是否是多线程环境（3个），2.是否有共享数据（tickets=100）. 3.是否多条语句操作共享数据（tickets--）
 *由于1和2的问题条件是必须存在的，只能更改3.  一个线程更改的时候不让其他更改
 *解决3的方法：
 * 同步代码块：
 *         synchronized(对象){   需要同步的代码  } 但要注意不要每个线程都锁一次
 *         多线程必须是同一把锁
 */

public class SellTicketDemoImpelRunnable implements Runnable {
    private  int tickets=100;
//   private  Object obj=new Object();
    public void run() {
        while (true)
        {
//            synchronized (obj) {
                if (tickets > 0) {
                    try {
                        Thread.sleep( 100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //开始售票
                    System.out.println(Thread.currentThread().getName() + "正在出售第  " + (tickets--) + "  张票");
                } else {
                    return;
//                }
            }
        }
    }
}
